package com.dao.impl;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;

import com.dao.MarcaDAO;
import com.dao.impl.mapper.MarcaMapper;
import com.modelo.Marca;
import com.modelo.Modelo;

public class IMarcaDAO implements MarcaDAO {

	private JdbcTemplate jdbcTemplate;
	private ArrayList<Marca> marcas;
	private Marca marca;
	int id_marca_nueva = 0;
	@Autowired
	public void setJdbcTemplate(JdbcTemplate jdbcTemplate){
		this.jdbcTemplate = jdbcTemplate;
	}
	
	@Override
	public List<Marca> mostrar() {
		marcas = new ArrayList<Marca>();
		try{
			String sql = "select * from marca";
			List<Map<String, Object>> rows = jdbcTemplate.queryForList(sql);
			for(Map row : rows){
				marca = new Marca();
				marca.setId(Integer.parseInt(String.valueOf(row.get("id"))));
				marca.setNombre(String.valueOf(row.get("nombre")));
				String s_sql = "select * from modelo where id_marca = ? ";
				
				List<Map<String, Object>> rows_modelos = jdbcTemplate.queryForList(s_sql, marca.getId());
				ArrayList<Modelo> modelos = new ArrayList<Modelo>();
				for(Map row_modelo : rows_modelos){
					Modelo modelo = new Modelo();
					modelo.setId(Integer.parseInt(String.valueOf(row_modelo.get("id"))));
					modelo.setNombre(String.valueOf(row_modelo.get("nombre")));
					modelos.add(modelo);
					System.out.println("IMarcaDAO: idMarca, nombreMarca, idModelo, nombreModelo: "+marca.getId()+" "+marca.getNombre()+" "+modelo.getId()+" "+modelo.getNombre());
				}
				marca.setModelos(modelos);
				marcas.add(marca);
			}
			
		}catch(Exception e){
			System.out.println("Bruno dice: Clase IMarcaDAO: "+e.getMessage());
		}	
		return marcas;
	}

	@Override
	public Marca buscarMarca(int id) {
		marca = new Marca();
		String sql = "select * from marca where id = ?";
		try{
			marca = jdbcTemplate.queryForObject(sql, new Object[]{id}, new RowMapper<Marca>(){
																	public Marca mapRow(ResultSet rs, int numrows)throws SQLException {
																		Marca m = new Marca();
																		m.setId(Integer.parseInt(String.valueOf(rs.getInt("id"))));
																		m.setNombre(rs.getString("nombre"));
																		return m;
																	}
				
			});
		}catch(Exception e){
			System.out.println("IMarcadAO buscarMarca() "+e.getMessage());
		}
		System.out.println("Marca nombre IMarcaDAO buscarMarca() "+marca.getNombre());
		return marca;
	}
	
	public Marca buscarMarcaElemento(int idEl){
		System.out.println("Metodo busarMarcaElemento() ");
		String sql = "select m.id, m.nombre from marca m, elemento e where m.id = e.id_marca and e.id = ? ";
		System.out.println("ID de elemento buscado: "+idEl);
		try{
			marca = jdbcTemplate.queryForObject(sql, new Object[]{idEl}, new RowMapper<Marca>(){
																	public Marca mapRow(ResultSet rs, int numrows)throws SQLException {
																		Marca m = new Marca();
																		m.setId(Integer.parseInt(String.valueOf(rs.getInt("id"))));
																		m.setNombre(rs.getString("nombre"));
																		
																		System.out.println("BuscarMarcaElemento() "+m.getId()+" "+m.getNombre());
																		return m;
																		
																	}
				
			});
		}catch(Exception e){
			System.out.println("IMarcadAO buscarMarcaElemento() "+e.getMessage());
		}
		System.out.println("Marca nombre IMarcaDAO buscarMarcaElemento() "+marca.getNombre());
		return marca;
	}
	
	public int insertar(Marca marca) {
		String sql = "insert into marca (nombre) values (?)";
		try{
			 id_marca_nueva=  jdbcTemplate.update(sql, new Object[]{marca.getNombre()});
			
		}catch(Exception e){
			id_marca_nueva = 0;
			System.out.println("Error ICategoriaElementoDAO insertar() "+e.getMessage());
		}
		return id_marca_nueva;
	}

	@Override
	public boolean eliminar(int id) {
		System.out.println("id que llega para eliminar: "+id);
		String sql = "delete from marca where id = ?";
		try{
			jdbcTemplate.update(sql, new Object[]{id});
		}catch(Exception e){
			System.out.println("Error eliminando marca en IMarcaDAO: "+e.getMessage());
			return false;
		}
		return true;
	}

	@Override
	public Marca actualizar(Marca marca) {
		// TODO Auto-generated method stub
		String sql = "update marca set nombre = ? where id = ?";
		Marca ma = new Marca();
		try{
			jdbcTemplate.update(sql, new Object[]{marca.getNombre(), marca.getId()});
			ma = buscarMarca(marca.getId());
		}catch(Exception e){
			System.out.println("IMarcaDAO actualizar error: "+e.getMessage());
			
		}
		return ma;
	}

	@Override
	public int numeroElementosPorMarca(int id) {
		// TODO Auto-generated method stub
		int cantidad = 0;
		String sql = "select count(*) from elemento el, marca ma where el.id_marca = ma.id and ma.id=?";
		try{
			cantidad = jdbcTemplate.queryForInt(sql, new Object[]{id});
		}catch(Exception e){
			cantidad = 0;
			System.out.println("Error recogiendo cantidad de elementos por marca::"+e.getMessage());
		}
		return cantidad;
	}
	
	public boolean eliminarElementosPorMarca(int id) {
		System.out.println("id que llega para eliminar: "+id);
		String sql = "delete from elemento where id_marca = ?";
		try{
			jdbcTemplate.update(sql, new Object[]{id});
		}catch(Exception e){
			System.out.println("Error eliminando elemento en IMarcaDAO: eliminarElementosPorMarca:  "+e.getMessage());
			return false;
		}
		return true;
	}
	
	public Marca buscarMarcaParaModelo(int idModelo){
		Marca m = new Marca();
		try{
			String sql = "select ma.id, ma.nombre from marca ma, modelo mo where mo.id_marca = ma.id and mo.id = ? ";
			m = (Marca)jdbcTemplate.queryForObject(sql,new Object[]{idModelo}, new MarcaMapper());
			System.out.println("IMarcaDAo: Marca para modelo "+m.getNombre());
		}catch(Exception e){
			System.out.println("Error IMarcaDAo mostrar(): "+e.getMessage());
		}
		return m;
	}
	
	
}
